package com.av.db.dataobjects;

import java.io.Serializable;
import java.util.Set;

import com.av.db.dataobjects.enums.Rol;

/**
 * Usuario registrado en el sistema
 * 
 * @author Victor J Morales R
 * 
 */
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	public static final String ID = "id";
	public static final String NOMBRES = "nombres";
	public static final String APELLIDO_PATERNO = "apellidoPaterno";
	public static final String APELLIDO_MATERNO = "apellidoMaterno";
	public static final String USER = "user";
	public static final String PASSWORD = "password";
	public static final String ACTIVO = "activo";

	// Miembros

	private int id;
	private Rol rol;
	private String nombres;
	private String apellidoPaterno;
	private String apellidoMaterno;
	private String user;
	private String password;
	private Idioma idioma;
	private boolean activo;

	private Set<Tarjeta> tarjetas;

	// Propiedades

	/**
	 * Obtiene el identificador del usuario registrado en la base de datos
	 */
	public int getId() {
		return id;
	}// getId

	/**
	 * Asigna el identificador de la tabla
	 * 
	 * @param id
	 *            Identificador
	 */
	@SuppressWarnings("unused")
	private void setId(int id) {
		this.id = id;
	}// setId

	/**
	 * Obtiene el <code>Rol</code> del usuario en el sistema
	 * 
	 * @return Rol del usuario
	 */
	public Rol getRol() {
		return rol;
	}// getRol

	/**
	 * Asigna al usuario un rol dentro del sistema
	 * 
	 * @param rol
	 *            Rol que adquiere el usuario dentro del sistema
	 */
	public void setRol(Rol rol) {
		this.rol = rol;
	}// setRol

	/**
	 * Obtiene el/los nombre(s) del usuario
	 * 
	 * @return Nombre(s)
	 */
	public String getNombres() {
		return nombres;
	}// getNombres

	/**
	 * Asigna el/los nombre(s) del usuario
	 * 
	 * @param nombres
	 *            Nombre(s)
	 */
	public void setNombres(String nombres) {
		this.nombres = nombres;
	}// setNombres

	/**
	 * Obtiene el apellido paterno del usuario
	 * 
	 * @return Apellido paterno
	 */
	public String getApellidoPaterno() {
		return apellidoPaterno;
	}// getApellidoPaterno

	/**
	 * Asigna el apellido paterno del usuario
	 * 
	 * @param apellidoPaterno
	 *            Apellido Paterno
	 */
	public void setApellidoPaterno(String apellidoPaterno) {
		this.apellidoPaterno = apellidoPaterno;
	}// setApellidoPaterno

	/**
	 * Obtiene el apellido materno del usuario
	 * 
	 * @return Apellido materno
	 */
	public String getApellidoMaterno() {
		return apellidoMaterno;
	}// getApellidoMaterno

	/**
	 * Asigna el apellido materno del usuario
	 * 
	 * @param apellidoMaterno
	 *            Apellido Materno
	 */
	public void setApellidoMaterno(String apellidoMaterno) {
		this.apellidoMaterno = apellidoMaterno;
	}// setApellidoMaterno

	/**
	 * Obtiene el user name o alias del usuario
	 * 
	 * @return Alias del usuario
	 */
	public String getUser() {
		return user;
	}// getUser

	/**
	 * Asignacion de user name o alias para el usuario
	 * 
	 * @param user
	 *            Alias del usuario a ser asignado
	 */
	public void setUser(String user) {
		this.user = user;
	}// setUser

	/**
	 * Obtiene el password del usuario
	 * 
	 * @return Password del usuario especifico
	 */
	public String getPassword() {
		return password;
	}// getPassword

	/**
	 * Asigna el password del usuario
	 * 
	 * @param password
	 *            Password asignado al usuario
	 */
	public void setPassword(String password) {
		this.password = password;
	}// setPassword

	/**
	 * Obtiene el idioma de preferencia del usuario
	 * 
	 * @return
	 */
	public Idioma getIdioma() {
		return idioma;
	}// getIdioma

	/**
	 * Asigna el idioma preferido del usuario
	 * 
	 * @param idioma
	 */
	public void setIdioma(Idioma idioma) {
		this.idioma = idioma;
	}// setIdioma

	/**
	 * Determina si el usuario esta activo en la base de datos
	 * 
	 * @return Verdadero en caso de ser activo
	 */
	public boolean isActivo() {
		return activo;
	}// isActivo

	/**
	 * Define el estado del usuario
	 * 
	 * @param activo
	 *            Estado del usario
	 */
	public void setActivo(boolean activo) {
		this.activo = activo;
	}// setActivo

	/**
	 * Obtiene las tarjetas asociadas al usuario
	 * 
	 * @return
	 */
	public Set<Tarjeta> getTarjetas() {
		return tarjetas;
	}// getTarjetas

	/**
	 * Asigna las tarjetas asociadas al usuario
	 * 
	 * @param tarjetas
	 */
	public void setTarjetas(Set<Tarjeta> tarjetas) {
		this.tarjetas = tarjetas;
	}// setTarjetas

	// Funciones

	/**
	 * Regresa el nombre completo del usuario
	 */
	public String toString() {
		if (this.nombres == null || this.apellidoPaterno == null
				|| this.apellidoMaterno == null) {
			return "";
		}

		return this.nombres.trim() + " " + this.apellidoPaterno.trim() + " "
				+ this.apellidoMaterno.trim();
	}// toString

	public boolean equals(Object o) {
		if (o == null || !(o instanceof Usuario)) {
			return false;
		}
		return ((Usuario) o).getId() == id;
	}// equals
}// Usuario